Apache Flink PlaygroundsでApache FlinkとApache Kafkaによるストリーム処理の雰囲気を感じてみた
Amazon Kinesis Data Analyticsでは、Apache Flinkをベースとしたストリーム処理が可能です。 Apache Flink PlaygroundsはFlinkの機能を手早く試せる環境をDocker Composeを使って構築できます。 今回はApache Flinkがどういったものなのかを知る為にApache Flink Playgroundsで遊んでみました。
- apache/flink-playgrounds: Apache Flink Playgrounds
- Apache Flink 1.9 Documentation: Flink Operations Playground
Apache Flink
Apache Flink is an open source platform for distributed stream and batch data processing. Flink’s core is a streaming dataflow engine that provides data distribution, communication, and fault tolerance for distributed computations over data streams. Flink builds batch processing on top of the streaming engine, overlaying native iteration support, managed memory, and program optimization.
Apache Flink 1.9 Documentation: Apache Flink Documentationより
やってみる
今回作成するPlayground環境は、次のようなデータの流れをFlinkとKafkaで構成します。
- Javaでクリックイベントデータを生成
- 生成したデータをKafkaのinputトピックに流し込む
- Flinkでページごとのイベント数をウインドウ時間ごとに集計
- 集計後データをKafkaのoutputトピックに流し込む
環境作成
Playground用のリポジトリをローカルにクローンしてきて、Docker Composeで各種コンテナを立ち上げます。
git clone --branch release-1.9 https://github.com/apache/flink-playgrounds.git cd flink-playgrounds/operations-playground docker-compose build docker-compose up -d docker-compose ps
FlinkやKafka、ZooKeeperのコンテナが起動しているのが確認できます。
WebUI
環境を作成したら、http://localhost:8081 からWebUIにアクセスできます。 WebUIからは動かしているジョブの確認や新しいジョブのサブミットなどが可能なようです。
ジョブのワークフローも次のように確認できます。
入力と出力の確認
Kafkaコンテナでkafka-console-consumer
を実行することで、Kafkaのトピックに流れているデータを確認できます。まずはinputトピックからみてみます。
docker-compose exec kafka kafka-console-consumer.sh \ --bootstrap-server localhost:9092 --topic input
大量のjson形式のデータが流れているのが確認できます。秒間で1000レコード程度のようです。
続いて、outputトピックの方も確認してみます。
docker-compose exec kafka kafka-console-consumer.sh \ --bootstrap-server localhost:9092 --topic output
こちらは15秒ごとに集計されたデータなので、流量は少ないです。
耐障害性の確認
Flinkはデータに対してexactly-once
の処理を行います。これは障害時も同様です。
これからわざとFlinkのタスクマネージャを落とし、しばらくした後に復帰させることで、このexactly-once
を確認してみます。
まずはタスクマネージャのコンテナを強制停止します。
docker-compose kill taskmanager
タスクが停止していることが、FlinkのWebUIからわかります。
タスクが停止しているため、Kafkaのoutputトピックにはデータが流れてきません。
それでは、タスクマネージャのコンテナを再び起動させてみます。
docker-compose up -d taskmanager
ジョブのステータスがCREATED
を経てRUNNING
に変化しました。
Kafkaのoutputトピックに流れる集計データはジョブが停止していた分も含めて流れてきました。
15秒ごとにデータが正しく集計されていることがわかります。 Flinkの耐障害性については以下のドキュメントで解説されています。興味のある方はご参照ください。
後片付け
遊び終えたら、起動していたコンテナを終了し、後片付けします。
docker-compose down -v
さいごに
Apache FlinkをApache Flink Playgroundsで環境を作り、Flinkの雰囲気や耐障害性についてざっくり確認しました。